package com.sykj.why.util;

import java.util.HashSet;
import java.util.Random;

/**
 * 随机验证码工具类
 * @author Arvin.Cao
 * @updater mr.will
 * @url https://www.cnblogs.com/shindo/p/5995849.html
 *
 */
public class RandomCodeUtil {

	public static final String ALLCHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	public static final String LETTERCHAR = "abcdefghijkllmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

	/**
	 * 获取手机短信验证码
	 * 
	 * @param num
	 *            验证码位数
	 * @return
	 */
	public static String getPhoneValidate(int num) {
		StringBuffer buffer = new StringBuffer();
		Random random = new Random();
		for (int i = 0; i < num; i++) {
			buffer.append(random.nextInt(10));
		}
		return buffer.toString();
	}

	/**
	 * 随机产生10位优惠码
	 * 
	 * @return
	 */
	public static String makeRandom() {
		Random select = new Random();
		// 更改数字可以选择随机出现的字符串长度
		int nowletter = 0;
		char nowlet = ' ';
		StringBuffer target = new StringBuffer(50);

		out: for (int i = 0; i < 10;) {
			// 这里更改数字可以决定出现的字符是出现在什么字符之间
			nowletter = select.nextInt(90);
			int j = 1;
			if ((nowletter > 49 && nowletter < 58) || nowletter > 65) {
				if (nowletter > 49 && nowletter < 58) {
					j++;
				}
				if (j == 4)
					continue out;
				nowlet = (char) nowletter;
				target.append(nowlet);
				i++;
			} else {
				continue;
			}
		}
		return target.toString();
	}

	/**
	 * 随机产生left - right的随机数
	 */
	public static int lrRandom(int left,int right){
		Random random = new Random();
		int number = random.nextInt(right) + left;
		return number;
	}

	/**
	 * 随机出指定范围内n个不重复的数
	 * @param min 指定范围最小值
	 * @param max 指定范围最大值
	 * @param n 随机数个数
	 * @param set 随机数结果集
	 */
	public static void randomSet(int min, int max, int n, HashSet<Integer> set) {
		if (n > (max - min + 1) || max < min) {
			return;
		}
		// 差多少个数就产生多少个随机数
		for (int i = 0; i < n - set.size(); i++) {
			// 调用Math.random()方法
			int num = (int) (Math.random() * (max - min)) + min;
			set.add(num);// 将不同的数存入HashSet中
		}
		// 如果存入的个数小于指定的个数，则调用递归再生成剩余个数的随机数，如此循环，直到达到指定大小
		if (set.size() < n) {
			randomSet(min, max, n, set);// 递归
		}
	}

	/**
	 * 返回一个定长的带因子的固定的随机字符串(只包含大小写字母、数字)
	 *
	 * @param length
	 * 随机字符串长度  返回一个定长的带因子的固定的随机字符串(只包含大小写字母、数字):" + generateStringByKey(32, channel)
	 * @return 随机字符串  MaigTil28hVETWTssFHGtYDxzeKc2PkT
	 */
	public static String generateStringByKey(int length, int channel) {
		StringBuffer sb = new StringBuffer();
		Random random = new Random(channel);
		for (int i = 0; i < length; i++) {
			sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));
		}
		return sb.toString();
	}

	/**
	 * 返回一个定长的随机字符串(只包含大小写字母、数字)
	 * @param length   返回一个定长的随机字符串(只包含大小写字母、数字):" + generateString(32));
	 * 随机字符串长度
	 * @return 随机字符串 :04nfGtVU0Jke fUQbMO1NML nbNp0kvSur
	 */
	public static String generateString(int length) {
		StringBuffer sb = new StringBuffer();
		Random random = new Random();
		for (int i = 0; i < length; i++) {
			sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));
		}
		return sb.toString();
	}

	/**
	 * 返回一个定长的随机纯字母字符串(只包含大小写字母)
	 * @param length  返回一个定长的随机纯字母字符串(只包含大小写字母):" + generateMixString(10));
	 *  随机字符串长度
	 * @return 随机字符串  hId8acG0p8
	 */
	public static String generateMixString(int length) {
		StringBuffer sb = new StringBuffer();
		Random random = new Random();
		for (int i = 0; i < length; i++) {
			sb.append(ALLCHAR.charAt(random.nextInt(LETTERCHAR.length())));
		}
		return sb.toString();
	}

	/**
	 * 返回一个定长的随机纯大写字母字符串(只包含大小写字母)
	 * @param length  返回一个定长的随机纯大写字母字符串(只包含大小写字母):" + generateLowerString(10));
	 * 随机字符串长度
	 * @return 随机字符串  ivoufjegef
	 */
	public static String generateLowerString(int length) {
		return generateMixString(length).toLowerCase();
	}

	/**
	 * 返回一个定长的随机纯小写字母字符串(只包含大小写字母)
	 * @param length  返回一个定长的随机纯小写字母字符串(只包含大小写字母):" + generateUpperString(10));
	 * 随机字符串长度
	 * @return 随机字符串  C3H65GOCRF
	 */
	public static String generateUpperString(int length) {
		return generateMixString(length).toUpperCase();
	}

	/**
	 * 生成一个定长的纯0字符串
	 * @param length
      字符串长度
	 * @return 纯0字符串   000000000
	 */
	public static String generateZeroString(int length) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < length; i++) {
			sb.append('0');
		}
		return sb.toString();
	}

	/**
	 * 根据数字生成一个定长的字符串，长度不够前面补0
	 *
	 * @param num
	 *            数字
	 * @param fixdlenth
	 *            字符串长度
	 * @return 定长的字符串  0000000123
	 */
	public static String toFixdLengthString(long num, int fixdlenth) {
		StringBuffer sb = new StringBuffer();
		String strNum = String.valueOf(num);
		if (fixdlenth - strNum.length() >= 0) {
			sb.append(generateZeroString(fixdlenth - strNum.length()));
		} else {
			throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth + "的字符串发生异常！");
		}
		sb.append(strNum);
		return sb.toString();
	}

	/**
	 * 每次生成的len位数都不相同
	 * int[] in = { 1, 2, 3, 4, 5, 6, 7 };
	 * @param param
	 * @return 定长的数字   "每次生成的len位数都不相同:" + getNotSimple(in, 3));   152
	 */
	public static int getNotSimple(int[] param, int len) {
		Random rand = new Random();
		for (int i = param.length; i > 1; i--) {
			int index = rand.nextInt(i);
			int tmp = param[index];
			param[index] = param[i - 1];
			param[i - 1] = tmp;
		}
		int result = 0;
		for (int i = 0; i < len; i++) {
			result = result * 10 + param[i];
		}
		return result;
	}


}
